# Система типов

Scala — уникальный язык, поскольку он статически типизирован, но часто кажется гибким и динамичным. 
Например, благодаря выводу типов можно писать код без явного указания типов переменных:

```dotty
val a = 1
val b = 2.0
val c = "Hi!"
```

Это делает код динамически типизированным. 
А благодаря новым функциям в Scala 3, таким как [объединение типов](type-system/types-union.md), 
также можно писать код, подобный следующему, который кратко выражает, 
какие значения ожидаются в качестве аргументов и какие типы возвращаются:

```dotty
def isTruthy(a: Boolean | Int | String): Boolean = ???
def dogCatOrWhatever(): Dog | Plant | Car | Sun = ???
```

Как видно из примера, при использовании объединения типы необязательно должны иметь общую иерархию, 
и их по-прежнему можно принимать в качестве аргументов или возвращать из метода.

При разработке приложений такие функции, как вывод типов, используются каждый день, а generics - каждую неделю. 
При чтении Scaladoc для классов и методов, также необходимо иметь некоторое представление о ковариантности. 
Использование типов может быть относительно простым, а также обеспечивает большую выразительность, 
гибкость и контроль для разработчиков библиотек.

### Преимущества типов

Языки программирования со статической типизацией предлагают ряд преимуществ, в том числе:

- помощь IDE в обеспечении надежной поддержки
- устранение многих классов потенциальных ошибок во время компиляции
- помощь в рефакторинге
- предоставление надежной документации, которая не может быть нерелевантной, поскольку проверена на тип


---

**Ссылки:**

- [Scala3 book](https://docs.scala-lang.org/scala3/book/types-introduction.html)
